Array


Generalmente quando si parla di array si fa riferimento ad un argomento specifico della programmazione classica, ma nel nostro caso studieremo il loro utilizzo all'interno della pagine ASP.

Possiamo considerare un array come una "megavariabile", capace di contenere al suo interno un nemero definito di valori, al contrario delle variabili scalari le quali sono associate in modo univoco ad un solo valore. Gli array sono quindi dei contenitori multidimensionali capaci di contenere un gran volume di informazioni, pronte e disponibili in ogni momento. Essendo indicizzati gli array necessitano di cicli for..next per l'estrazione delle informazioni in essi stipati.

Chi produce siti web a livello professionale si è sicuramente scontrato con form con un elevato numero di controlli, pensiamo ad esempi a form di contatto o registrazione che possono avere anche oltre 20-25 controlli al loro interno.
Gestire 20-25 controlli (text, radio, checkbox, select, ecc..) ed i valori ad essi associati non è del tutto semplice soprattuto quando diventa necessario applicare routine di validazione server/side più o meno complesse sui singoli campi del form e magari in seguito spedire il contenuto del form ad un database o ad un component come CDONTS per spedire un email.

Poniamo il caso che il nostro cliente compili un form di questa complessità, fatto questo invii il form ad una pagina ASP che processa i campi del form, li valida e in caso di errore ri-posta i valori al form iniziale per la correzione degli stessi.
Tornando al form iniziale il cliente troverebbe il messaggio di errore, ma, purtroppo, anche i campi vuoti là dove le risposte erano corrette. Al poveretto non rimane che ricompilare il form daccapo e con pazienza rinviare il tutto.
Per evitare cose di questo genere provate a dare una occhiata allo scripts ASP qui sotto.

Per comodità ho disegnato due pagine ASP, la prima contiene una utile Funzione in VBS che si occupa di recuperare i valori contenuti nell'array che abbiamo definito nella testata della stessa pagina, ed inoltre il codice HTML del form vero e proprio che dobbiamo compilare.
Analizzando nel dettaglio il codice vediamo che se l'array non è pieno, cioè nel caso in cui accediamo per la prima volta alla pagina del form, i campi del form si presenteranno vuoti e quindi dovranno essere compilati dall'utente.
Una volta compilato, l'utente invia il contenuto del form alla seconda pagina ASP, la quale contiene il codice ASP per riempire l'arrayform con i valori dei controlli.
Qui viene ridimensionato e riempito (attraverso un ciclo for..next) un array bidimensionale contenente le coppie "nome del controllo / valore del controllo della form", i suddetti valori si ottengono svuotando il Request.Form del suo contenuto attraverso un ciclo for..next.
Una volta fatto questo ridimensiono l'array alle giuste dimensioni, e ne metto il contenuto in una session variable per poterlo passare da una pagina ASP all'altra.
Nell'ultima parte di codice della seconda pagina possiamo vedere a video il contenuto dell'array appena creato e ridimensionato.
La cosa si fa nteressante se premiamo il tasto back del nostro browser, difatti ci apparirà il nostro form ma con i campi riempiti dai valori precedentemente immessi. Proviamo a cambiare alcuni valori e rinviamo il form, ripetiamo l'operazione di prima (tasto back) e vedremo il form con i nuovi valori.

Quale utilità ?

A prima vista forse non si capisce bene la comodità nell'utilizzo dell'array per la gestione dei form, ma vediamo qualche dettaglio:

Prima Pagina ASP

<HTML>
<%

'recupero il nome della pagina corrente
NomePagina = Request.ServerVariables("SCRIPT_NAME")
NomePagina = Mid(NomePagina, InstrRev(NomePagina, "/") + 1)
'recupero l'array dalla variabile session, se esiste ovviamente...
arrayForm = Session(NomePagina) [TOP]
 

Function RecuperaValArray(NomeControlloForm, ValoreAssociato)
  On Error Resume Next
'cerco il numero di valori contenuti nell'array
   intValoreArry = UBound(arrayForm, 2)
'se la funzione Ubound() non mi genera errori
  If Err.Number <> 0 Then Exit Function
'comincio a leggere l'array per
'recuperare i valori dei controlli della precedente sessione
  For intLoop = 0 To intValoreArry
'guardo se il nome del controllo è presente nell'array
  If LCase(arrayForm(0, intLoop)) = LCase(NomeControlloForm) Then
'se c'è valuto la possibilità che il valore ad esso
'associato sia quello di una checkbox o un bottone di opzione, ad esempio
  If ValoreAssociato <> "" Then
'se è così setto il valore appropriato
  If LCase(ValoreAssociato) = LCase(arrayForm(1, intLoop)) Then
   RecuperaValArray = "CHECKED"
  Else
   RecuperaValArray = ""
  End If
  Else
'se invece il valore è una stringa
   RecuperaValArray = arrayForm(1, intLoop)
  End If
  Exit Function
  End If
  Next
 End Function

%>
<HEAD>
<TITLE>Form per per la dimostrazione dell'uso degli array</TITLE>
</HEAD>
<BODY><FONT FACE="Tahoma,Arial,sans-serif" SIZE="2">

<FORM ACTION="array1.asp" METHOD="POST">[TOP]


TuoNome: <INPUT TYPE="TEXT" NAME="TuoNome" VALUE="<% = RecuperaValArray("TuoNome", "") %>"> <BR>
TuoCognome: <INPUT TYPE="TEXT" NAME="TuoCognome" VALUE="<% = RecuperaValArray("TuoCognome", "") %>"> <P>
Cosa ti piace mangiare ?
<INPUT TYPE="CHECKBOX" NAME="Pastasciutta" <% = RecuperaValArray("Pastasciutta", "on") %>> Pastasciutta  
<INPUT TYPE="CHECKBOX" NAME="Lasagne" <% = RecuperaValArray("Lasagne", "on") %>> Lasagne  
<INPUT TYPE="CHECKBOX" NAME="Brodino" <% = RecuperaValArray("Brodino", "on") %>> Brodino
<P>

CantantiPreferiti: <INPUT TYPE="TEXT" NAME="CantantiPreferiti" VALUE="<% = RecuperaValArray("CantantiPreferiti(1)", "") %>"> <BR>
CantantiPreferiti: <INPUT TYPE="TEXT" NAME="CantantiPreferiti" VALUE="<% = RecuperaValArray("CantantiPreferiti(2)", "") %>"> <BR>
CantantiPreferiti: <INPUT TYPE="TEXT" NAME="CantantiPreferiti" VALUE="<% = RecuperaValArray("CantantiPreferiti(3)", "") %>"> <P>

Vivo in:

<INPUT TYPE="RADIO" NAME="Paese" VALUE="Italia" <% = RecuperaValArray("Paese", "Italia") %>> Italia  
<INPUT TYPE="RADIO" NAME="Paese" VALUE="Europa" <% = RecuperaValArray("Paese", "Europa") %>> Europa  
<INPUT TYPE="RADIO" NAME="Paese" VALUE="Altrove" <% = RecuperaValArray("Paese", "Altrove") %>> Altrove   <P>
<INPUT TYPE="SUBMIT" VALUE="Submit">  
<INPUT TYPE="RESET" VALUE="Reset">  

</FORM></FONT>
</BODY>
</HTML>

Seconda Pagina ASP

<HTML>
<HEAD>
<TITLE>Immagazzinare i valori di un Form in un Array</TITLE>
</HEAD>
<BODY>

<%
'creiamo un array bidimensionale, un po abbondante visto
' che non conosco il numero di controlli del form
ReDim arrayForm(1, 255)
intIndice = 0
'andiamo a "loppare" Request.Form per ricevere tutte le informazioni contenute

For Each varItem in Request.Form
If Request.Form(varItem).count > 1 Then
'se il numero di controlli del form e maggiore di uno
For intLoop = 1 to Request.Form(varItem).count
'immagazzino nell'array le coppie nome-controllo/valore-controllo
arrayForm(0, intIndice) = varItem & "(" & intLoop & ")"
arrayForm(1, intIndice) = Request.Form(varItem)(intLoop)
intIndice = intIndice + 1
Next
Else
'nel caso sia presente un singolo valore nell'oggetto Request.Form invece:
arrayForm(0, intIndice) = varItem
arrayForm(1, intIndice) = Request.Form(varItem)
intIndice = intIndice + 1
End If
Next

'ridimensiono l'array alle giuste dimensioni, dato che ora
' conosco il numero di controlli del form
ReDim Preserve arrayForm(1, intIndice - 1)

'Ricevo il nome dalla variabile session
'attraverso questo script
NomePaginaPrec = Request.ServerVariables("HTTP_REFERER")
NomePaginaPrec = Mid(NomePaginaPrec, InstrRev(NomePaginaPrec, "/") + 1)

'salvo l'array nella Sessione
Session(NomePaginaPrec) = arrayForm

Response.Write "<BR><h2>---- Valori Ricevuti dal Form ed immagazzinati dall'Array----</h2><BR>"
'MOSTRO A VIDEO IL CONTENUTO DELL'ARRAY
For intIndice = 0 To UBound(arrayForm, 2)
Response.Write arrayForm(0, intIndice) & " = " _
& arrayForm(1, intIndice) & "<BR>"
Next

%>
</BODY>
</HTML>

Questi sono solo alcuni dei vantaggi ottenibili dall'uso degli array, in seguito scrivero altri articoli per mostrare la validazione applicata alle form con array, la gestione dei valori del form all'interno di un database e la creazione via CDONTS di un report email personalizzato che sfrutti i valori contenuti nell'array.

Ed anche per questa volta è tutto. Buona programmazione!